const { bfmetaSDK } = require('../../util/util')
const { signature } = require('../../util/signature')

// 将为地址设置用户名。用户名将在链上展示，仅有一次设置用户名的机会，且用户名不可更改。
const setUserName= () => {
    return async (req, res, next) => {
      try {
        if(!req.body.alias || !req.body.publicKey){
            return res.status(400).send({
                success: false,
                message: "参数不能为空"
            })
        }
        if(typeof req.body.publicKey !== 'string'|| typeof req.body.alias !== 'string'){
            return res.status(400).send({
                success: false,
                message: "参数类型必须为string"
            })
        }
        let data = {
          publicKey: req.body.publicKey,
          fee: "2000",
          // 用户名字符串，大小写字母、数字、下划线组成，1-20 个字符，不能包含当前链的名称 
          alias: req.body.alias,
          applyBlockHeight: 1
        }
        // 创建设置用户名事件
        let result = await bfmetaSDK.api.transaction.createUsername(data)
        if(!result.success){
            return res.status(400).send(result)
        }
        // 生成签名 验证事件信息
        const _signature = await signature(result.result.buffer, req.body.secretKey)
        data = {
          signature: _signature,
          buffer: result.result.buffer,
        }
        // 广播设置用户名事件
        result = await bfmetaSDK.api.transaction.broadcastUsername(data)
        if(!result.success){
          return res.status(400).send(result)
        }
        res.status(200).send(result)
      } catch (error) {
        next(error)
      }
    }
  }
  
module.exports = {setUserName}